[AD] Scalaアプリケーションの開発・保守は合同会社ミルクソフトにお任せください
この記事では、Scala 3から不可能となった、抽象型を使用した型射影について解説します。
抽象型の型射影が禁止された
これまでScalaでは、T
を任意の型とし、A
をT
の型のメンバとしたときの、一般型射影T#A
を許可していました。
Dottyでは、T
が抽象型の場合には禁止されるようになりました。
ただし、T
がクラスや型エイリアスである場合には問題ありません。
抽象型の型射影を使ったコードを書き換えるには、経路依存型や暗黙のパラメータの使用を検討してください。
変更の理由と影響
この変更は、型射影を無制限とすると、コンパイルは通るにもかかわらず実行時エラーjava.lang.ClassCastException
を投げる例が生じてしまうことから行われました。
詳しくはこちらのIssueをご覧ください。
この制限により、SKIコンビナート演算の型レベルのエンコーディングができなくなります。
SKIコンビネータ演算、あるいはその型レベルのエンコーディングについては以下のリンクで詳しく解説されています。
外部リンク:SKIコンビネータ計算 - Wikipedia
移行はScala 3.0にアップデートしてからがおすすめ
型射影はScala 3.0でも使用することができます。
3.0において型射影を書くと、場合によってはコンパイルエラーになります。
しかし移行オプション3.0-migration
を設定すると、以前と同様に使用することができます。
移行オプションについてはこちらの記事をご覧ください。
移行コストが高いと予想されるので、3.0へのアップデート後、パワーアップしたScalaの機能をフル活用して書き換えるのが得策です。
サイト内検索
カテゴリ「Scala 3で廃止予定の機能」の記事
弱適合:Scala 3で廃止予定の機能(13)
DelayedInitの解説:Scala 3で廃止予定の機能(1)
[this]修飾子:Scala 3で廃止予定の機能(12)
Scala 3で変更・廃止予定の機能と移行作業についてのまとめ
シンボルリテラルの解説:Scala 3で廃止予定の機能(3)
自動適用:Scala 3で廃止予定の機能(14)
forSomeによる存在型:Scala 3で廃止予定の機能(6)
型射影:Scala 3で廃止予定の機能(7)
手続き型構文:Scala 3で廃止予定の機能(8)
先行初期化:Scala 3で廃止予定の機能(9)
do-while文の解説:Scala 3で廃止予定の機能(4)
Scala 2のマクロ:Scala 3で廃止予定の機能(5)
クラスシャドウイング:Scala 3で廃止予定の機能(10)
XMLリテラルの解説:Scala 3で廃止予定の機能(2)
大域脱出:Scala 3で廃止予定の機能(11)
カテゴリ「Scala 3で廃止予定の機能」の記事
弱適合:Scala 3で廃止予定の機能(13)
DelayedInitの解説:Scala 3で廃止予定の機能(1)
[this]修飾子:Scala 3で廃止予定の機能(12)
Scala 3で変更・廃止予定の機能と移行作業についてのまとめ
シンボルリテラルの解説:Scala 3で廃止予定の機能(3)
自動適用:Scala 3で廃止予定の機能(14)
forSomeによる存在型:Scala 3で廃止予定の機能(6)
型射影:Scala 3で廃止予定の機能(7)
手続き型構文:Scala 3で廃止予定の機能(8)
先行初期化:Scala 3で廃止予定の機能(9)
do-while文の解説:Scala 3で廃止予定の機能(4)
Scala 2のマクロ:Scala 3で廃止予定の機能(5)
クラスシャドウイング:Scala 3で廃止予定の機能(10)
XMLリテラルの解説:Scala 3で廃止予定の機能(2)
大域脱出:Scala 3で廃止予定の機能(11)